<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="format-detection" content="telephone=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><link rel="icon" href="/images/touxiang1.png?v=2.6.1" type="image/png" sizes="16x16"><link rel="icon" href="/images/touxiang1.png?v=2.6.1" type="image/png" sizes="32x32"><meta name="description" content="反射_01                           创建运行时类的对象                           有了Class对象，能做什么？       创建类的对象： 调用Class对象的newInstance()方法要 求： 1）类必须有一个无参数的构造器。2）类的构造器的访问权限需要足够。难道没有无参的构造器就不能创建对象了吗">
<meta property="og:type" content="article">
<meta property="og:title" content="反射">
<meta property="og:url" content="https://gityang2016.gitee.io/2021/01/27/java_annotation_01/index.html">
<meta property="og:site_name" content="Yangj&#39;s blog">
<meta property="og:description" content="反射_01                           创建运行时类的对象                           有了Class对象，能做什么？       创建类的对象： 调用Class对象的newInstance()方法要 求： 1）类必须有一个无参数的构造器。2）类的构造器的访问权限需要足够。难道没有无参的构造器就不能创建对象了吗">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="https://gityang2016.gitee.io/images/java/reflect/reflect10.png">
<meta property="og:image" content="https://gityang2016.gitee.io/images/java/reflect/reflect11.png">
<meta property="og:image" content="https://gityang2016.gitee.io/images/java/reflect/reflect12.png">
<meta property="og:image" content="https://gityang2016.gitee.io/images/java/reflect/reflect13.png">
<meta property="og:image" content="https://gityang2016.gitee.io/images/java/reflect/reflect18.png">
<meta property="article:published_time" content="2021-01-26T16:10:37.753Z">
<meta property="article:modified_time" content="2021-02-03T03:22:31.326Z">
<meta property="article:author" content="Yangj">
<meta property="article:tag" content="反射">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://gityang2016.gitee.io/images/java/reflect/reflect10.png"><title>反射 | Yangj's blog</title><link ref="canonical" href="https://gityang2016.gitee.io/2021/01/27/java_annotation_01/"><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.12.1/css/all.min.css" type="text/css"><link rel="stylesheet" href="/css/index.css?v=2.6.1"><script>var Stun = window.Stun || {};
var CONFIG = {
  root: '/',
  algolia: undefined,
  assistSearch: undefined,
  fontIcon: {"prompt":{"success":"fas fa-check-circle","info":"fas fa-arrow-circle-right","warning":"fas fa-exclamation-circle","error":"fas fa-times-circle"},"copyBtn":"fas fa-copy"},
  sidebar: {"offsetTop":"20px","tocMaxDepth":6},
  header: {"enable":true,"showOnPost":true,"scrollDownIcon":true},
  postWidget: {"endText":true},
  nightMode: {"enable":true},
  back2top: {"enable":true},
  codeblock: {"style":"default","highlight":"light","wordWrap":false},
  reward: false,
  fancybox: false,
  zoomImage: {"gapAside":"20px"},
  galleryWaterfall: undefined,
  lazyload: false,
  pjax: undefined,
  externalLink: {"icon":{"enable":true,"name":"fas fa-external-link-alt"}},
  shortcuts: undefined,
  prompt: {"copyButton":"Copy","copySuccess":"Copy Success","copyError":"Copy Error"},
  sourcePath: {"js":"js","css":"css","images":"images"},
};

window.CONFIG = CONFIG;</script><meta name="generator" content="Hexo 5.3.0"><link rel="alternate" href="/atom.xml" title="Yangj's blog" type="application/atom+xml">
</head><body><div class="container" id="container"><header class="header" id="header"><div class="header-inner"><nav class="header-nav header-nav--fixed"><div class="header-nav-inner"><div class="header-nav-menubtn"><i class="fas fa-bars"></i></div><div class="header-nav-menu"><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/"><span class="header-nav-menu-item__icon"><i class="fas fa-home"></i></span><span class="header-nav-menu-item__text">Home</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/archives/"><span class="header-nav-menu-item__icon"><i class="fas fa-folder-open"></i></span><span class="header-nav-menu-item__text">Archives</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/categories/"><span class="header-nav-menu-item__icon"><i class="fas fa-layer-group"></i></span><span class="header-nav-menu-item__text">Categories</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/tags/"><span class="header-nav-menu-item__icon"><i class="fas fa-tags"></i></span><span class="header-nav-menu-item__text">Tags</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/aboutme/"><span class="header-nav-menu-item__icon"><i class="fas fa-user-tag"></i></span><span class="header-nav-menu-item__text">About</span></a></div></div><div class="header-nav-mode"><div class="mode"><div class="mode-track"><span class="mode-track-moon"></span><span class="mode-track-sun"></span></div><div class="mode-thumb"></div></div></div></div></nav><div class="header-banner"><div class="header-banner-info"><div class="header-banner-info__title">Yangj's blog</div><div class="header-banner-info__subtitle">It is never too late to mend</div></div><div class="header-banner-arrow"><div class="header-banner-arrow__icon"><i class="fas fa-angle-down"></i></div></div></div></div></header><main class="main" id="main"><div class="main-inner"><div class="content-wrap" id="content-wrap"><div class="content" id="content"><!-- Just used to judge whether it is an article page--><div id="is-post"></div><div class="post"><header class="post-header"><h1 class="post-title">反射</h1><div class="post-meta"><span class="post-meta-item post-meta-item--createtime"><span class="post-meta-item__icon"><i class="far fa-calendar-plus"></i></span><span class="post-meta-item__info">Created</span><span class="post-meta-item__value">2021-01-27</span></span><span class="post-meta-item post-meta-item--updatetime"><span class="post-meta-item__icon"><i class="far fa-calendar-check"></i></span><span class="post-meta-item__info">Updated</span><span class="post-meta-item__value">2021-02-03</span></span></div></header><div class="post-body">
        <h1 id="反射-01"   >
          <a href="#反射-01" class="heading-link"><i class="fas fa-link"></i></a>反射_01</h1>
      
        <h2 id="创建运行时类的对象"   >
          <a href="#创建运行时类的对象" class="heading-link"><i class="fas fa-link"></i></a>创建运行时类的对象</h2>
      
        <h3 id="有了Class对象，能做什么？"   >
          <a href="#有了Class对象，能做什么？" class="heading-link"><i class="fas fa-link"></i></a>有了Class对象，能做什么？</h3>
      <p>创建类的对象： 调用Class对象的newInstance()方法<br><br>要 求： 1）类必须有一个无参数的构造器。<br>2）类的构造器的访问权限需要足够。<br><br>难道没有无参的构造器就不能创建对象了吗？<br><br>不是！只要在操作的时候明确的调用类中的构造器， 并将参数传递进去之后，才可以实例化操作。<br><br>步骤如下：<br>1）通过Class类的getDeclaredConstructor(Class … parameterTypes)取得本类的指定形参类型的构造器<br><br>2）向构造器的形参中传递一个对象数组进去，里面包含了构造器中所需的各个参数。<br><br>3）通过Constructor实例化对象。</p>
<figure class="highlight java"><div class="table-container"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//1.根据全类名获取对应的Class对象</span></span><br><span class="line">String name = “atguigu.java.Person<span class="string">&quot;;</span></span><br><span class="line"><span class="string">Class clazz = null;</span></span><br><span class="line"><span class="string">clazz = Class.forName(name);</span></span><br><span class="line"><span class="string">//2.调用指定参数结构的构造器，生成Constructor的实例</span></span><br><span class="line"><span class="string">Constructor con = clazz.getConstructor(String.class,Integer.class);</span></span><br><span class="line"><span class="string">//3.通过Constructor的实例创建对应类的对象，并初始化类属性</span></span><br><span class="line"><span class="string">Person p2 = (Person) con.newInstance(&quot;</span>Peter<span class="string">&quot;,20);</span></span><br><span class="line"><span class="string">System.out.println(p2);</span></span><br></pre></td></tr></table></div></figure>

        <h2 id="通过反射获取运行时类的完整结构"   >
          <a href="#通过反射获取运行时类的完整结构" class="heading-link"><i class="fas fa-link"></i></a>通过反射获取运行时类的完整结构</h2>
      <p>Field、 Method、 Constructor、 Superclass、 Interface、 Annotation<br><br> 实现的全部接口<br><br> 所继承的父类<br><br>全部的构造器<br><br> 全部的方法<br><br> 全部的Field</p>
<p>使用反射可以取得：<br><br>1.实现的全部接口<br><br> public Class&lt;?&gt;[] getInterfaces()<br>确定此对象所表示的类或接口实现的接口。<br><br>2.所继承的父类<br><br> public Class&lt;? Super T&gt; getSuperclass()<br>返回表示此 Class 所表示的实体（类、接口、基本类型）的父类的Class。</p>
<p>3.全部的构造器<br><br> public Constructor<T>[] getConstructors()<br><br>返回此 Class 对象所表示的类的所有public构造方法。<br><br>public Constructor<T>[] getDeclaredConstructors()<br><br>返回此 Class 对象表示的类声明的所有构造方法。<br> <br>Constructor类中：<br> <br>取得修饰符: public int getModifiers();<br> <br>取得方法名称: public String getName();<br> <br>取得参数的类型： public Class&lt;?&gt;[] getParameterTypes();</p>
<p>4.全部的方法<br><br> public Method[] getDeclaredMethods()<br><br>返回此Class对象所表示的类或接口的全部方法<br><br> public Method[] getMethods()<br><br>返回此Class对象所表示的类或接口的public的方法<br><br> Method类中：<br><br> public Class<?> getReturnType()取得全部的返回值
<br>public Class<?>[] getParameterTypes()取得全部的参数<br><br> public int getModifiers()取得修饰符<br><br> public Class&lt;?&gt;[] getExceptionTypes()取得异常信息</p>
<p>4.全部的方法<br><br> public Method[] getDeclaredMethods()<br>返回此Class对象所表示的类或接口的全部方法<br><br> public Method[] getMethods()<br>返回此Class对象所表示的类或接口的public的方法<br><br> Method类中：<br><br> public Class<?> getReturnType()取得全部的返回值
<br> public Class<?>[] getParameterTypes()取得全部的参数<br><br> public int getModifiers()取得修饰符<br><br> public Class&lt;?&gt;[] getExceptionTypes()取得异常信息<br><br>6. Annotation相关<br><br> get Annotation(Class<T> annotationClass)<br><br> getDeclaredAnnotations()<br><br>7.泛型相关<br><br>获取父类泛型类型： Type getGenericSuperclass()<br><br>泛型类型： ParameterizedType<br><br>获取实际的泛型类型参数数组： getActualTypeArguments()<br><br>8.类所在的包 Package getPackage()</p>

        <h2 id="调用运行时类的指定结构"   >
          <a href="#调用运行时类的指定结构" class="heading-link"><i class="fas fa-link"></i></a>调用运行时类的指定结构</h2>
      
        <h3 id="1-调用指定方法"   >
          <a href="#1-调用指定方法" class="heading-link"><i class="fas fa-link"></i></a>1.调用指定方法</h3>
      <p>通过反射，调用类中的方法，通过Method类完成。步骤：<br><br>1.通过Class类的getMethod(String name,Class…parameterTypes)方法取得<br>一个Method对象，并设置此方法操作时所需要的参数类型。<br><br>2.之后使用Object invoke(Object obj, Object[] args)进行调用，并向方法中<br>传递要设置的obj对象的参数信息。</p>
<p><br>Object invoke(Object obj, Object … args)<br><br>说明：<br><br>1.Object 对应原方法的返回值，若原方法无返回值，此时返回null<br><br>2.若原方法若为静态方法，此时形参Object obj可为null<br><br>3.若原方法形参列表为空，则Object[] args为null<br><br>4.若原方法声明为private,则需要在调用此invoke()方法前，显式调用<br>方法对象的setAccessible(true)方法，将可访问private的方法。</p>
<p>2.调用指定属性<br><br>在反射机制中，可以直接通过Field类操作类中的属性，通过Field类提供的set()和<br>get()方法就可以完成设置和取得属性内容的操作。<br><br> public Field getField(String name) 返回此Class对象表示的类或接口的指定的<br>public的Field。<br><br> public Field getDeclaredField(String name)返回此Class对象表示的类或接口的<br>指定的Field。<br><br>在Field中：<br><br> public Object get(Object obj) 取得指定对象obj上此Field的属性内容<br><br> public void set(Object obj,Object value) 设置指定对象obj上此Field的属性内容</p>

        <h2 id="反射的应用：动态代理"   >
          <a href="#反射的应用：动态代理" class="heading-link"><i class="fas fa-link"></i></a>反射的应用：动态代理</h2>
      <p><br>代理设计模式的原理:<br>使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原<br>始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原<br>始对象上。<br><br> 之前为大家讲解过代理机制的操作，属于静态代理，特征是代理类和目标<br>对象的类都是在编译期间确定下来，不利于程序的扩展。同时，每一个代<br>理类只能为一个接口服务，这样一来程序开发中必然产生过多的代理。 最<br>好可以通过一个代理类完成全部的代理功能。</p>
<p><br>动态代理是指客户通过代理类来调用其它对象的方法，并且是在程序运行时<br>根据需要动态创建目标类的代理对象。<br><br>动态代理使用场合:<br><br>调试<br><br>远程方法调用<br><br>动态代理相比于静态代理的优点：<br>抽象角色中（接口）声明的所有方法都被转移到调用处理器一个集中的方法中<br>处理，这样，我们可以更加灵活和统一的处理众多的方法。<br><img src="/images/java/reflect/reflect10.png"><br><img src="/images/java/reflect/reflect11.png"><br><img src="/images/java/reflect/reflect12.png"><br><img src="/images/java/reflect/reflect13.png"></p>
<figure class="highlight java"><div class="table-container"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">RealSubject target = <span class="keyword">new</span> RealSubject();</span><br><span class="line"><span class="comment">// Create a proxy to wrap the original implementation</span></span><br><span class="line">DebugProxy proxy = <span class="keyword">new</span> DebugProxy(target);</span><br><span class="line"><span class="comment">// Get a reference to the proxy through the Subject interface</span></span><br><span class="line">Subject sub = (Subject) Proxy.newProxyInstance(</span><br><span class="line">Subject.class.getClassLoader(),<span class="keyword">new</span> Class[] &#123; Subject.class &#125;, proxy);</span><br><span class="line"></span><br><span class="line"><span class="number">4.</span>通过 Subject代理调用RealSubject实现类的方法</span><br><span class="line">String info = sub.say(“Peter<span class="string">&quot;, 24);</span></span><br><span class="line"><span class="string">System.out.println(info);</span></span><br></pre></td></tr></table></div></figure>

        <h2 id="动态代理与AOP（Aspect-Orient-Programming"   >
          <a href="#动态代理与AOP（Aspect-Orient-Programming" class="heading-link"><i class="fas fa-link"></i></a>动态代理与AOP（Aspect Orient Programming)</h2>
      <p><img src="/images/java/reflect/reflect18.png"><br> <br>使用Proxy生成一个动态代理时，往往并不会凭空产生一个动态代理，这样没有<br>太大的意义。通常都是为指定的目标对象生成动态代理<br> <br>这种动态代理在AOP中被称为AOP代理， AOP代理可代替目标对象， AOP代理<br>包含了目标对象的全部方法。但AOP代理中的方法与目标对象的方法存在差异：<br>AOP代理里的方法可以在执行目标方法之前、之后插入一些通用处理</p>
</div><footer class="post-footer"><div class="post-ending ending"><div class="ending__text">------ END ------</div></div><div class="post-copyright copyright"><div class="copyright-author"><span class="copyright-author__name">Author: </span><span class="copyright-author__value"><a href="https://gityang2016.gitee.io">Yangj</a></span></div><div class="copyright-link"><span class="copyright-link__name">Link: </span><span class="copyright-link__value"><a href="https://gityang2016.gitee.io/2021/01/27/java_annotation_01/">https://gityang2016.gitee.io/2021/01/27/java_annotation_01/</a></span></div><div class="copyright-notice"><span class="copyright-notice__name">Copyright: </span><span class="copyright-notice__value">All articles in this blog are licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en" rel="external nofollow" target="_blank">BY-NC-SA</a> unless stating additionally</span></div></div><div class="post-tags"><span class="post-tags-item"><span class="post-tags-item__icon"><i class="fas fa-tag"></i></span><a class="post-tags-item__link" href="https://gityang2016.gitee.io/tags/%E5%8F%8D%E5%B0%84/">反射</a></span></div><nav class="post-paginator paginator"><div class="paginator-prev"><a class="paginator-prev__link" href="/2021/03/22/ngnix_01/"><span class="paginator-prev__icon"><i class="fas fa-angle-left"></i></span><span class="paginator-prev__text">Nginx</span></a></div><div class="paginator-next"><a class="paginator-next__link" href="/2021/01/27/JVM_01/"><span class="paginator-prev__text">JVM</span><span class="paginator-next__icon"><i class="fas fa-angle-right"></i></span></a></div></nav></footer></div></div></div><div class="sidebar-wrap" id="sidebar-wrap"><aside class="sidebar" id="sidebar"><div class="sidebar-nav"><span class="sidebar-nav-toc current">Catalog</span><span class="sidebar-nav-ov">Overview</span></div><section class="sidebar-toc"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%8F%8D%E5%B0%84-01"><span class="toc-number">1.</span> <span class="toc-text">
          反射_01</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%88%9B%E5%BB%BA%E8%BF%90%E8%A1%8C%E6%97%B6%E7%B1%BB%E7%9A%84%E5%AF%B9%E8%B1%A1"><span class="toc-number">1.1.</span> <span class="toc-text">
          创建运行时类的对象</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%9C%89%E4%BA%86Class%E5%AF%B9%E8%B1%A1%EF%BC%8C%E8%83%BD%E5%81%9A%E4%BB%80%E4%B9%88%EF%BC%9F"><span class="toc-number">1.1.1.</span> <span class="toc-text">
          有了Class对象，能做什么？</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%80%9A%E8%BF%87%E5%8F%8D%E5%B0%84%E8%8E%B7%E5%8F%96%E8%BF%90%E8%A1%8C%E6%97%B6%E7%B1%BB%E7%9A%84%E5%AE%8C%E6%95%B4%E7%BB%93%E6%9E%84"><span class="toc-number">1.2.</span> <span class="toc-text">
          通过反射获取运行时类的完整结构</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%B0%83%E7%94%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E7%B1%BB%E7%9A%84%E6%8C%87%E5%AE%9A%E7%BB%93%E6%9E%84"><span class="toc-number">1.3.</span> <span class="toc-text">
          调用运行时类的指定结构</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1-%E8%B0%83%E7%94%A8%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95"><span class="toc-number">1.3.1.</span> <span class="toc-text">
          1.调用指定方法</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%8F%8D%E5%B0%84%E7%9A%84%E5%BA%94%E7%94%A8%EF%BC%9A%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86"><span class="toc-number">1.4.</span> <span class="toc-text">
          反射的应用：动态代理</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E4%B8%8EAOP%EF%BC%88Aspect-Orient-Programming"><span class="toc-number">1.5.</span> <span class="toc-text">
          动态代理与AOP（Aspect Orient Programming)</span></a></li></ol></li></ol></section><!-- ov = overview--><section class="sidebar-ov hide"><div class="sidebar-ov-author"><div class="sidebar-ov-author__avatar"><img class="sidebar-ov-author__avatar_img" src="/images/touxiang2.jpg" alt="avatar"></div><p class="sidebar-ov-author__text">Storms make trees take deeper roots</p></div><div class="sidebar-ov-social"><a class="sidebar-ov-social-item" href="https://github.com/Gityang2016" target="_blank" rel="noopener" data-popover="Github" data-popover-pos="up"><span class="sidebar-ov-social-item__icon"><i class="fab fa-github"></i></span></a></div><div class="sidebar-ov-state"><a class="sidebar-ov-state-item sidebar-ov-state-item--posts" href="/archives/"><div class="sidebar-ov-state-item__count">6</div><div class="sidebar-ov-state-item__name">Archives</div></a><a class="sidebar-ov-state-item sidebar-ov-state-item--categories" href="/categories/"><div class="sidebar-ov-state-item__count">8</div><div class="sidebar-ov-state-item__name">Categories</div></a><a class="sidebar-ov-state-item sidebar-ov-state-item--tags" href="/tags/"><div class="sidebar-ov-state-item__count">5</div><div class="sidebar-ov-state-item__name">Tags</div></a></div><div class="sidebar-ov-cc"><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en" target="_blank" rel="noopener" data-popover="Creative Commons" data-popover-pos="up"><img src="/images/cc-by-nc-sa.svg"></a></div></section><div class="sidebar-reading"><div class="sidebar-reading-info"><span class="sidebar-reading-info__text">You have read </span><span class="sidebar-reading-info__num">0</span><span class="sidebar-reading-info__perc">%</span></div><div class="sidebar-reading-line"></div></div></aside></div><div class="clearfix"></div></div></main><footer class="footer" id="footer"><div class="footer-inner"><div><span>Copyright © 2021</span><span class="footer__icon"><i class="fas fa-heart"></i></span><span>Gityang2016</span></div><div><span>Powered by <a href="http://hexo.io/" title="Hexo" target="_blank" rel="noopener">Hexo</a></span><span> v5.3.0</span><span class="footer__devider">|</span><span>Theme - <a href="https://github.com/liuyib/hexo-theme-stun/" title="Stun" target="_blank" rel="noopener">Stun</a></span><span> v2.6.1</span></div></div></footer><div class="loading-bar" id="loading-bar"><div class="loading-bar__progress"></div></div><div class="back2top" id="back2top"><span class="back2top__icon"><i class="fas fa-rocket"></i></span></div></div><script src="https://cdn.jsdelivr.net/npm/jquery@v3.4.1/dist/jquery.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.2/velocity.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.2/velocity.ui.min.js"></script><script src="/js/utils.js?v=2.6.1"></script><script src="/js/stun-boot.js?v=2.6.1"></script><script src="/js/scroll.js?v=2.6.1"></script><script src="/js/header.js?v=2.6.1"></script><script src="/js/sidebar.js?v=2.6.1"></script></body></html>